{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 示例：剩余使用寿命预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "is_executing": true,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "from fastphm.data.FeatureExtractor import FeatureExtractor\n",
    "from fastphm.data.labeler.RulLabeler import RulLabeler\n",
    "from fastphm.data.loader.bearing.XJTULoader import XJTULoader\n",
    "from fastphm.data.processor.RMSProcessor import RMSProcessor\n",
    "from fastphm.metric.end2end.PHM2008Score import PHM2008Score\n",
    "from fastphm.metric.end2end.PHM2012Score import PHM2012Score\n",
    "from fastphm.metric.end2end.PercentError import PercentError\n",
    "from fastphm.model.pytorch.PytorchModel import PytorchModel\n",
    "from fastphm.data.stage.BearingStageCalculator import BearingStageCalculator\n",
    "from fastphm.data.stage.fpt.ThreeSigmaFPTCalculator import ThreeSigmaFPTCalculator\n",
    "from fastphm.model.pytorch.basic.CNN import CNN\n",
    "from fastphm.metric.Evaluator import Evaluator\n",
    "from fastphm.metric.end2end.MAE import MAE\n",
    "from fastphm.metric.end2end.MSE import MSE\n",
    "from fastphm.metric.end2end.RMSE import RMSE\n",
    "from fastphm.util.Plotter import Plotter"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 定义 数据加载器、特征提取器、fpt计算器、eol计算器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "DEBUG - 17:59:57 >> \n",
      "<< Root directory of dataset: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\n",
      "\tBearing1_1, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_1\n",
      "\tBearing1_2, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_2\n",
      "\tBearing1_3, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_3\n",
      "\tBearing1_4, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_4\n",
      "\tBearing1_5, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\35Hz12kN\\Bearing1_5\n",
      "\tBearing2_1, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_1\n",
      "\tBearing2_2, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_2\n",
      "\tBearing2_3, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_3\n",
      "\tBearing2_4, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_4\n",
      "\tBearing2_5, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\37.5Hz11kN\\Bearing2_5\n",
      "\tBearing3_1, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_1\n",
      "\tBearing3_2, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_2\n",
      "\tBearing3_3, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_3\n",
      "\tBearing3_4, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_4\n",
      "\tBearing3_5, location: D:\\data\\dataset\\XJTU-SY_Bearing_Datasets\\40Hz10kN\\Bearing3_5\n"
     ]
    }
   ],
   "source": [
    "data_loader = XJTULoader('D:\\\\data\\\\dataset\\\\XJTU-SY_Bearing_Datasets')\n",
    "feature_extractor = FeatureExtractor(RMSProcessor(data_loader.continuum))\n",
    "fpt_calculator = ThreeSigmaFPTCalculator()\n",
    "stage_calculator = BearingStageCalculator(data_loader.continuum, fpt_calculator)\n",
    "Plotter.DPI = 80"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 获取原始数据、特征数据、阶段数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO - 17:59:57 >> Loading data entity: Bearing1_3\n",
      "INFO - 18:00:00 >> Successfully loaded data entity: Bearing1_3\n"
     ]
    }
   ],
   "source": [
    "bearing = data_loader(\"Bearing1_3\", 'Horizontal Vibration')\n",
    "feature_extractor(bearing)\n",
    "stage_calculator(bearing)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 生成训练数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "generator = RulLabeler(2048, is_from_fpt=False, is_rectified=True, time_ratio=60)\n",
    "data_set = generator(bearing)\n",
    "train_set, test_set = data_set.split(0.7)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 定义模型并训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "is_executing": true,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO - 18:00:01 >> \n",
      "<< Successfully initialized model:\n",
      "\tclass: CNN\n",
      "\tdevice: cuda\n",
      "\tdtype: torch.float32\n",
      "INFO - 18:00:01 >> \n",
      "<< Start training model:\n",
      "\tloss function: MSELoss\n",
      "\toptimizer: Adam\n",
      "\tlearning rate: 0.001\n",
      "\tweight decay: 0.01\n",
      "\tbatch size: 128\n",
      "DEBUG - 18:00:01 >> Epoch 1/10, Loss: 0.1733657446\n",
      "DEBUG - 18:00:01 >> Epoch 2/10, Loss: 0.0210772298\n",
      "DEBUG - 18:00:01 >> Epoch 3/10, Loss: 0.0073193488\n",
      "DEBUG - 18:00:01 >> Epoch 4/10, Loss: 0.0042569251\n",
      "DEBUG - 18:00:01 >> Epoch 5/10, Loss: 0.0033636705\n",
      "DEBUG - 18:00:01 >> Epoch 6/10, Loss: 0.0027673860\n",
      "DEBUG - 18:00:01 >> Epoch 7/10, Loss: 0.0025107774\n",
      "DEBUG - 18:00:01 >> Epoch 8/10, Loss: 0.0023957182\n",
      "DEBUG - 18:00:01 >> Epoch 9/10, Loss: 0.0023091653\n",
      "DEBUG - 18:00:01 >> Epoch 10/10, Loss: 0.0021174903\n",
      "INFO - 18:00:01 >> Model training completed!!!\n"
     ]
    },
    {
     "data": {
      "image/png": "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0ACISj/+8Y9VWloa6TIAxAguOQGIGYZh6LnnnlNZWZmKior08ssvh7f96le/ktvt1u23366vfvWram5uDm+rq6tTaWmp5s6dqzvvvFMejye87dvf/rbuuOMOFRYW6pe//OV4fhwAY4gzNACi0iOPPDLsktNvf/tbSaFQ8/777+vIkSO68847tWDBAk2YMEGPPvqodu3apTlz5ujll1/W1772Ne3fv19vvvmm1q1bp3feeUcOh0M9PT2SpM7OTp0+fVq333671q5dq//8z//UN7/5Td17770R+bwAbg6tDwBEnfz8fP30pz+97JKTYRjyeDyaNm2aJOnBBx/UQw89pEmTJunFF1/Url27wmMnTpyoDz/8UJs2bVJGRobWrVs37Fgej0clJSXq6emRYRg6ffq0brnlFvn9frM/HgATcMkJQEwzDOOG901LSwvvn5ycrIGBgbEqC8A4I9AAiCl1dXWSQmdYmpqa9JWvfEXz5s3TBx98oA8//FCStGPHDn3xi1/UF7/4Rd1///3atm2b2tvbJUk9PT3hy04A4gdzaABEpUvn0PzzP/+zJGlgYEBlZWXq7u7Wv/zLvyg/P1+S9PLLL+sb3/iG/H6/Jk2apFdffVWGYeiuu+7St7/9bd1zzz0yDEOpqamqr6+PxEcCYCLm0ACIGYZh6NSpU5o4cWKkSwEQZbjkBAAAYh6XnADEDE4oA7gSztAAAICYR6ABAAAxj0ADAABiHoEGAADEPAINAACIeQQaAAAQ8/4fogTiM80Fg14AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 560x384 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "model = PytorchModel(CNN(2048, 1))\n",
    "model.train(train_set, 10, weight_decay=0.01)\n",
    "Plotter.loss(model)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 做出预测"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "is_executing": true,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjQAAAGECAYAAAAhqbrrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAAxOAAAMTgF/d4wjAABwk0lEQVR4nO3deVzU1frA8c+wKCK4gSuLiEC5hEbYTbJcyo0KQ71ZamXllpUpZpuaZmLulv00bdMsS0tFTTH1ppWm9yahWWoGKgru4AbKzvf3xzjTzDAzDDALA8/79SKbme/yfGdGvo/nPOcclaIoCkIIIYQQTszF0QEIIYQQQlSWJDRCCCGEcHqS0AghhBDC6UlCI4QQQginJwmNEEIIIZyeJDRCCCGEcHqS0AghhBDC6UlCI0Q1MHnyZLp166Z93LdvX955550KH2/37t14eXlRXFxsheiqjmnTptGlSxerH/fKlStER0fToEED/P39rX78ypo5cya9evVydBhC2JQkNKLa69atG7Vq1cLLy4t69erRrl07li1bVmqbyZMnl9p32LBhDB06VPtYpVLxn//8x+YxV9bWrVuZMmWKRdsaXiPAfffdR05ODq6urrYIr8ow9bmX19KlSzl//jwXLlwgIyPD5Lk030MvLy/8/Px48cUXyc3NrfT5y/Lmm2+yfft2qx5z9erV3HfffdSrVw+VSkVRUZHF+27cuJHw8HAaNmxIgwYNiIiIYO3atVaNT9Q8ktCIGuHVV18lJyeHq1evMnXqVJ5//nl++uknR4dVSmFhoaNDcJiCggJHh1Bhx48fp23bttSuXdvsdprvYU5ODr/88gs//PAD06dPt1lciqKUK9Eoj4YNGzJmzBjee++9cu8bGRnJ1q1buXz5MleuXOG9997jySef5Pfff7d+oKLGkIRG1CguLi489thjNGrUiP3799v0XCtWrMDf35/3338ff39/fHx8ePbZZ8nJydFuExQUxNSpU+nTpw/e3t7Mnz8fgJUrV9KhQwfq169Pu3btWL16td6xv/jiC0JDQ/H29qZ///5cvXpV73XDloeMjAyGDBmCv78/9erVo2PHjiQnJzNz5kxWrVrFmjVrtC0Hp0+f5scff9T7V3dxcTFz584lLCyM+vXra29IGprt165dS1hYGN7e3vTs2ZMzZ86YfH803T9TpkyhRYsWdOzYEYC//vqLhx9+mKZNm+Ln58eYMWO4ceMGoL5Bv/XWW/j7++Pt7Y2/vz9vvvkmAGlpaahUKlJTU0vFZeymPnr0aHbv3s2cOXO0127Kvn37uO+++2jYsCGtWrXi9ddfJz8/H4AePXrw+eefa9/D0aNHmzyOrqCgIPr06cOhQ4e0zxUXFzN//nzatGlD/fr1ueuuu/jhhx+0r//555888MADNG7cmPr16/Ovf/2LnTt3al/XvAeffvopHTp0wNPTk6SkpFJdbd26dePll19m8ODB1K9fn4CAAD788EO9+JYvX05ISIj2O/biiy/qdWv27t2bJ554guDgYIuuV5efnx9+fn6oVCoURcHFxQVFUUhJSSn3sYTQUoSo5rp27apMmjRJURRFKSwsVFatWqUAyubNm41uo+vpp59WhgwZon0MKDt27LDovMuXL1dcXV2VYcOGKTk5OUpGRoYSGRmpDB8+XLtNy5YtlaZNmyp79+5VSkpKlBs3bijLly9XAgIClP379yvFxcXK7t27FW9vb2X37t2KoijKL7/8ori5uSmbNm1SCgsLlU2bNikeHh5K165djV7PzZs3ldDQUGXYsGHKpUuXlOLiYuXw4cNKWlqa0WtUFEXZtWuXAiiFhYWKoijKvHnzFD8/P+W3335TCgsLla+//lpxd3dXfvvtN73tBw8erFy9elW5evWqEhUVpTz11FMm35+pU6cqrq6uyttvv63k5uYqN27cUC5duqT4+voqCxYsUPLy8pRLly4pDzzwgPY92759u+Ln56ecOnVKURRFycrKUvbu3asoiqKcPHlSAZSUlBST1zF16lTl3nvvNfo+mXLq1CnF09NTWbhwoZKfn6/8/fffStu2bZWXX35Zu42x99CQ4blSU1OV2267TZk1a5bee9KhQwflr7/+UoqLi5X169crnp6eSmpqqqIoivLHH38o27dvV27evKnk5eUpU6dOVerVq6dcuHBB7z2IiopSTp8+rRQVFWm3M7zuevXqKT/88INSXFysrF27VnFxcdG+dz/99JNSq1YtJTExUSkqKlK2bNmi1KlTR+87Zuo9ttTVq1eV+vXrK25ubgqgdOnSRbl582a5jiGELmmhETXCvHnzaNCgAR4eHjz11FPMnj2bhx56yObnVRSF9957j7p16+Ln58f06dP5/PPP9Yptn3nmGTp37oxKpcLT05MFCxYw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7rvvVhRFfbPo2bOnEhISorRt21bZuXOng6O1Lt1fGtXxWo8fP65069ZNad++vRIeHq6sXbtWUZTq913+6quvtNfYvn17ZdWqVYqiVI/PdOTIkYqfn5/i6uqqNGnSRGndurWiKOY/Q2f8fI1dp7nfTYrivJ+vqc9Ul2FC44zXauo6Tf1eUhTbfHdl6QMhhBBCOD2poRFCCCGE05OERgghhBBOTxIaIYQQQjg9SWiEEEII4fQkoRFCCCGE05OERgghhBBOT5Y+EEJUWMeOHQEoKCjg2LFj3HHHHQDcdttt2h/NTKG2cPPmTe6//3527dqFt7d3ufbt2LEju3fvLnO/V155hYiICAYPHlyZUIUQNibz0AghKi0tLY2OHTty9epVu553zpw55OfnM2XKFJud4+LFi3Tp0oWjR4/i6upqs/MIISpHupyEEDYxbNgw3nvvPQCmTZvGY489xiOPPEJYWBgPP/wwf/75J7179yYsLIwnnniCkpISALKzsxkxYgR333034eHhjBw5koKCAqPnWLZsmV7LSVBQEJMnTyYqKoqAgACWLl3K8uXL6dy5M0FBQaxevVq7rUql0iZgQUFBvPXWW3Tu3JlWrVoxY8YM7XZNmjShdevWbN++3crvkBDCmiShEULYRVJSEitXruTYsWNkZ2czfPhw1q5dy5EjRzh69Chbt24FYMKECdx33338+uuv/P7775SUlPD++++XOl56ejrXrl2jdevWes/fuHGDvXv3smvXLsaPH8+ZM2fYt28f3377LS+99JLJ+K5evcq+ffvYv38/c+fO5cyZM9rXOnfuXG1XfxaiupAaGiGEXfTq1YuGDRsCEBERQe3atbX1K3feeScpKSkAbNiwgX379rFgwQIAcnNzjXb1ZGRk0LRp01LPDxo0CICQkBA8PDwYOHAgAJGRkVy+fJmrV6/SoEGDUvtpWnp8fX0JDg7m5MmT+Pn5AdCsWTOOHDlSmcsXQtiYJDRCCLvw8PDQ/r+rq2upx0VFRQAoisK6desICwszezxPT0/y8vIsPo9KpUKlUmnPU9Z+utvl5eVRp04ds/EIIRxLupyEEFXKo48+yuzZs7UJxZUrV0hNTS213W233cbFixfJzc21eUxHjx6lQ4cONj+PEKLiJKERQlQpCxcupE6dOnTs2JHw8HAeeOAB0tLSSm3n4eFBr1692Llzp03jURSFH374gdjYWJueRwhROTJsWwjhtH799VemT5/O5s2bbXaO77//ni+//JIvv/zSZucQQlSetNAIIZzW3XffTf/+/cnOzrbZOa5du8acOXNsdnwhhHVIC40QQgghnJ600AghhBDC6UlCI4QQQginJwmNEEIIIZyeJDRCCCGEcHqS0AghhBDC6UlCI4QQQgin9//MpLPhu+PXvAAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 560x384 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "'RUL prediction result of Bearing1_3'"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result = model.test(test_set)\n",
    "Plotter.rul_end2end(test_set, result, label_x='Time (min)', label_y='Relative RUL')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": false,
    "jupyter": {
     "outputs_hidden": false
    },
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "### 预测结果评价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "pycharm": {
     "is_executing": true,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO - 18:00:02 >> \n",
      "<< Performance Evaluation of Bearing1_3:\n",
      "\tMAE: 0.0366\n",
      "\tMSE: 0.0024\n",
      "\tRMSE: 0.0492\n",
      "\tPercent Error: 0.24%\n",
      "\tPHM2012 Score: 0.6792\n",
      "\tPHM2008 Score: 2.4484\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'MAE': 0.036576505978121475,\n",
       " 'MSE': 0.0024213656947625426,\n",
       " 'RMSE': 0.04920737439411437,\n",
       " 'Percent Error': 0.23699788280007214,\n",
       " 'PHM2012 Score': 0.6792209760792851,\n",
       " 'PHM2008 Score': 2.448375481312847}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evaluator = Evaluator()\n",
    "evaluator.add(MAE(), MSE(), RMSE(), PercentError(), PHM2012Score(), PHM2008Score())\n",
    "evaluator(test_set, result)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}